約 1,995,955 件
https://w.atwiki.jp/cod_bo4/pages/58.html
コーネリウス・パーネル (アボガドロとしても知られている)は、Treyarchのゾンビモードに登場するキャラクターであり、ブロークンアローのリーダーである。パーネルはもともとCall of Duty World at WarのマップShi No Numaのラジオに登場した。パーネルは『コール オブ デューティ ブラックオプス』のCIAデータサーバーでも言及されており、ピーター・マケインへの通信の記録がVbushファイルで発見できる。 Pernellは『Call of Duty Black Ops III』のマップ『Revelations』のラジオに、代替宇宙のカウンターパートであるコーネリウアとして登場しています。Pernellはまた、Call of Duty Black Ops 4のマップ「Classified」と「Alpha Omega」のいくつかのラジオやオーディオログでも聞くことができる。Alpha Omegaでは、Pernellが既にマップTranZitで見られるAvogadroとして知られる存在になったことが明らかになった。 人物紹介 トリビア 人物紹介 コーネリウス・パーネルは、第二次世界大戦中のOSSのメンバーであり、複数の工作員のハンドラーでした。彼はグループ935のピーター・マケインに潜入する作戦を成功させ、ピーターはベルリンの亡命施設に移送されました。グループ935は彼らの実験の制御を失っていたことを疑って、パーネルは1945年8月に海兵隊の偵察部隊を送った、チームは "タンク "デンプシーによって導かれた。 アウトブレイクは、亡命施設でまもなく発生し、スパイとして追放されたピーターは、脱出することができました。偵察チームは亡命施設内でゾンビの大群に直面し、チームは殺され、デンプシーは最終的にグループ935に捕らえられました。1945年9月、パーネルはピーター・マケインと連絡を取り、グループ935とディビジョン9の管理下にあるライジング・サン施設で待ち合わせをしようとした。翌月、ピーターはライジングサン施設の上をパラシュートで通過し、まもなく死亡した。 戦後、パーネルはネバダ州のグルーム湖でCIAの支局長に就任し、1937年にエレメント115の大規模な鉱床が発見された。 1961年、グルーミングレイクでは、施設と月のグリフィン基地を結ぶテレポーターの建設が始まり、パーネルはこのプロジェクトを監督した。翌年、パーネルはグルーム湖の核実験場で、アメリカのピラミッド装置の建設を監督し始めました。 1963年2月、パーネルはドクター・シュースターからサマンサ・マキシスの存在を知った。数ヶ月に及ぶ調査の末、彼はアメリカ政府がサマンサと戦うためにはさらに多くのエレメント115が必要であると確信し、長年夢見ていたプログラム「プロジェクト・ブロークン・アロー」の資金を確保できると確信していた。1963年8月3日、テレポーターで新たなテストが行われる中、アルティミスのクルー(エドワード・リヒトーフェン、"タンク "デンプシー、ニコライ・ベリンスキー、正木武雄)は月からテレポートされ、グルーム湖に到着した。健康診断の後、コーネリウス・パーネルはクルーをエレメント115実験の被験者として第4格納庫に監禁した。パーネルにとっては残念なことに、数ヶ月後、ウルティミスはプリミスの協力を得て脱出することになった。 ペンタゴン事件の後、サマンサを標的にした攻撃に焦点を当てたブロークン・アローのプロジェクトは棚上げされた。A.P.D.は、CIAのMKUltraプロジェクトの一環として、MKAlphaプロジェクトの尋問ツールとして再利用された。そのため、A.P.D.の建設を予定通りに完了させるために、より多くの資金が提供された。 1964年6月、1946年にディビジョン9から入手したエレメンタル・シャードを使用して、パーネルとドクター・ヘイルはピーター・マケインを復活させた。ピーターはまもなくブロークンアローで働き始めた。 1965年2月、MKAlphaのフェーズIIの一環として、パーネルはユーリ・ザボイスキーの尋問を開始した。ペルネルはユーリからエーテルとアガルタについて学んだが、ペルネルはその過程でユーリを殺すことになってしまった。パーネルはアガルタに到達することに執着し始め、エレメント115に何年もさらされた後、彼はアルティミス・リクトーフェンに似た声を聞き始め、ますます妄想的になっていった。1966年までに、彼は繰り返し夢を見るようになり、そのうちの一つはエレメンタル・シャードを使ってA.P.D.内のアボガドロになっている姿を示していた。 一年後の1967年8月、パーネルは、彼への愛情がよく知られているヘイル博士の助けを借りて、自分自身をA.P.D.の中に入れ、エレメンタル・シャードから電流を引いてA.P.D.を浸水させるという実験を始めた。キャンプエドワードで副所長になったピーターは、実験について聞き、パーネルに対してジョージ・ソーヤーに報告書を提出することにした。ピーターにとっては残念なことに、パーネルはその報告書を知り、彼を逮捕させた。 1968年3月15日、ソーヤーと彼の部下は、施設の電力を失う原因となる実験の一つの間にキャンプエドワードに到着し、コーネリウス・パーネルをアボガドロに変身させた。アボガドロは施設内にノヴァ6ガスを放出し、ゾンビとA.D.A.M.ユニットを解き放ち、全員を殺害した。これにより、キャンプ・エドワードは完全に封鎖され、放棄され、ラシュモアも閉鎖されることになった。 それからほぼ60年後の2025年7月、ブロークン・アローのエージェントであるラスマンとジョージ・バークレーは施設に戻り、A.P.D.を使ってアボガドロのサンプルをワシントン州のハンフォードのサイトに移した。数ヶ月後の10月13日、プリミスとウルティミスはエレメンタル・シャードを回収するためにキャンプ・エドワードに到着し、これによりアボガドロの覚醒とその後の封じ込め違反に備えた安全策として核を爆発させることになったが、それを止めることはできなかった。プリミスとウルティミスとの激しい戦いの後、アボガドロは敗れてA.P.D.に強制的に戻され、ワシントン州のハンフォード基地に送られ、適切な投獄を受けることになった。 ハンフォード遺跡では、アボガドロは発電所を装ったブロークンアローの施設に収容されていたが、最終的には地球滅亡後の2035年10月にビクティスによって解放された。最終的に、アボガドロはルードヴィク・マクシスの動力源としてパイロンに消費された。 トリビア ・『リベレーションズ』ゲーム内に、コーネリアという女性がラジオを残している 情報元は海外サイトのCall of Duty Wikiより。https //callofduty.fandom.com/wiki/Peter_McCain#References 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/cod_declassified/pages/40.html
引用元 グレード タイトル 詳細情報 プラチナ 征服の余地なし コール オブ デューティ® ブラックオプス ディクラシファイドで全てのトロフィーを獲得する ブロンズ 新鮮な肉は最高 いずれかの難易度でオペレーションモードを開始する シルバー 爆安セール いずれかのオペレーションで 1発のグレネードで4人の敵をキル シルバー カット ラン いずれかのオペレーションで 5人の敵を格闘攻撃で続けて倒す シルバー ヘッドバンガー いずれかのオペレーションで 10連続ヘッドショットを達成する ブロンズ 駐車違反 オペレーションモードで合計20台の車両を破壊する ブロンズ 血を流せ オペレーションモードで 100人の敵を格闘攻撃で倒す ブロンズ 容赦なく いずれかのオペレーションで 10人の敵を5秒以内にキル ブロンズ 正義に死角あり いずれかのオペレーションで フラッシュバングレネードでマヒした敵を4人キル ブロンズ くっつけろ いずれかのオペレーションで セムテックスを1人ずつに貼りつけて5人の敵をキル シルバー いい仕事 オペレーション"Three Point Landing"で 15人の敵をRPGでキル シルバー 適正価格 リロードすることなく オペレーション"Escort Service"をクリアする ブロンズ バリスティックでいこう オペレーション"Rocket s Red Glare"で BALLISTIC KNIFEによる格闘攻撃で10人の敵をキル シルバー 雪のように白く ダメージを受けることなくオペレーション"Rocket s Red Glare"をクリアする ブロンズ 暗闇なんて怖くない ナイトビジョンを使用せずにオペレーション"Active Measures"をクリアする シルバー 射撃名人 オペレーション"OPS M.I.A."で .357マグナムを使って10回ヘッドショットを行う シルバー ダブルダウン オペレーション"OPS M.I.A."で 4発以下の弾丸で8人の敵をキル シルバー 欲しがらない 無駄にしない オペレーション"OPS M.I.A."を100%の命中率でクリアする ブロンズ 押しつぶされる空 オペレーション"Air Traffic Control"で 迫撃砲攻撃により3人の敵をキル ブロンズ 世界最高のベビーシッター オペレーション"Air Traffic Control"で 全ての分析官を守り抜く ブロンズ デリバリー テイクアウト オペレーション"Self Destructive"で 60秒以内にC4を設置する ブロンズ 熱力学の理論 オペレーション"Self Destructive"で 1発のグレネードで2人の科学者をキル ブロンズ 世捨て人 オペレーション"Self Destructive"で 全ての科学者をヘッドショットでキル ブロンズ 片手で帽子を被る音 オペレーション"Got Your Back"をハンドガンだけでクリアする ブロンズ 勤勉な警官 オペレーション"Hostile Takeover"で 薬物の塊を10個撃つ シルバー 主張 オペレーション"Hostile Takeover"で 2人のボスをヘッドショットでキル シルバー 情熱 オペレーション"Hostile Takeover"で トーレスを格闘攻撃でキル ブロンズ 製品テスト オペレーション"Hostile Takeover"で ナイフで薬物の塊を10個破壊する ブロンズ ブロックの周りに いずれかの難易度で 全てのオペレーションをクリアする ブロンズ 充実したひと時 いずれかの難易度で 全てのタイムアタックをクリアする ゴールド ホスタイル・ウィットネス ホスタイルモードで 13ウェーブに耐え抜く ゴールド ブラッド ゴア 各オペレーションで3つの星を獲得する ゴールド 最良の時 各タイムアタックで3つの星を獲得する ゴールド 危険な労働環境 ホスタイルで3つの星を獲得する 国内版・海外版とも少数だが「ブラッド ゴア」などがバグにより取れないとの報告あり。 可能な限りオートセーブがされている時にスリープやホームボタンなどで中断しないのが賢明か。 オペレーションのトロフィーは「条件を満たした時点で取得できるもの」と、「条件を満たしてオペレーションをクリアした時点で取得できるもの」の2種類がある。「いずれかのオペレーションで~」と書かれたものと「熱力学の理論」「世捨て人」は前者、特定のオペレーションを指定しているトロフィーは基本的にクリア後に取得。 容赦なく「Escort Service」の最初の敵の大群がオススメ。 ダッシュで敵を全て無視してL96のある部屋まで行き、少し待つと部屋の右側あたりに敵が溜まる。 そこにセムテックスを投げ入れまとめて倒し、左側にスポーンする敵2体を続けて倒せばちょうど10体倒せる。 正義に死角あり「Got Your Back」の2つ目のブリーチして突入する部屋が狙い目。スローが解けたあとにフラッシュバンを投げ入れる。 銃でうまくいかない場合、フラググレネード→フラッシュバンの順ですぐに投げ入れるとスタンと同時に一気に倒せる。 くっつけろ「Self Destructive」がセムテックス(グレネード)を5つ持っている状態で始まるので、このセムテックスを全て敵の体に付着させて倒す必要がある。 いい仕事累計ではなく1ミッション中に15キル。RPGは位置固定で4~5箇所ほど落ちているので複数まとめて倒すようにする。 雪のように白く参考→http //www.youtube.com/watch?v=ByZobjxAC9c 途中の倉庫で、上記の動画の様にCHINA LALEを持っていかなくても、CROSS BOW、RPGでも代用できる。 難しい場合、最初で拾えるAK-47 グレネーターや、上記の3種類のランチャー系等の爆発物をフルに使うと、敵の数が多い時に楽に進められる。 ダブルダウン参考→http //www.youtube.com/watch?v=QWn061-vxu8 ただし上記の動画の通りにやっても重なるかどうかは運が絡む。スコーピオンによるダメージ調整も重要となる。 動画以外の場所では.357マグナムが置いてある部屋の敵も狙うことができる。 入り口の敵を倒し、中の2人いる敵どちらかをスコーピオンで2~3発撃ちフラッシュで怯ませてから、 もう片方の敵側からスナイパーライフルで重なるように撃つ(敵が屈んだ状態になるのでこちらも屈んだり伏せたりして撃つ)。 片手で帽子を被る音初期装備のSCORPIONだけでキルすればよい(正確にはサブマシンガンではあるが)。 情熱格闘キルを狙う場合、トーレスは最初のエリアで倒すのが楽。ヘッドショットも同様に狙いやすい。 トーレスのマーカーが付いたら2階からフラッシュバンを投げ込みスタンさせ、 他の敵も無視して扉に先回りするとトーレスが近寄ってくるのであとは格闘キルやヘッドショットを狙うだけ。 ホスタイル・ウィットネス耐えぬく…とあるが、実際は到達した段階で取得できる。 危険な労働環境トロフィー説明文では分かりにくいが、ホスタイルモード全てで★3評価を出す必要がある。 作られてないので作った。 -- 名無しさん (2014-08-19 20 43 29) ダブルダウンは乱数待ちになる可能性が大きいので取る人は苦労しますよ 取るのに三ヶ月かかりました -- N (2015-01-19 17 48 21) 名前 コメント
https://w.atwiki.jp/yomedousi/pages/1368.html
スレ49-741 741 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 42 04.52 0 かまってちゃんの義弟嫁から、うちのいえ電話の留守電に、「今から死にます」みたいな内容のメッセージがあった。 幸い、泊りがけで遊びに行って疲れた子供たちが寝た後に気がついたので子供への悪影響は大丈夫。 遊びに行った先は旦那の出張先。 つまり、旦那はうちにいません。 この電話をどうしたらいいもんか思案中。 742 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 46 30.49 0 履歴も留守電も即消去 743 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 47 43.52 0 義弟はどうした 744 名前:741[sage] 投稿日:2011/11/27(日) 23 53 05.52 0 夜中に速いレスありがとう! 旦那ももう寝てるだろうし、出張先の仕事がハードなので、 今は旦那を騒がせたくないので困ってたのでありがとう。 義弟の連絡先とか知りません。 義弟嫁も同じだけど、住所と家電話しか連絡先知らない。 消去しちゃうのは後々ややこしい気がするので、聞いてなかったことにして寝ちゃおうかなぁ 745 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 53 47.13 0 741 警察に通報 自分は子持ちで物理的にも距離的にも夜中に向かうのは無理 本人からの自殺予告なので緊急を要する 以上の二点で警察に通報する条件は揃っている かまってちゃんでも警察沙汰になれば懲りるんじゃないの 741に連絡=警察が来るになれば二度と連絡ないと思うよ 746 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 55 04.71 0 つ転送 → 旦那 → 義弟 747 名前:名無しさん@HOME[sage] 投稿日:2011/11/27(日) 23 58 36.39 0 かまってちゃんは一度痛い目にあわせないとダメだね 叩きなおすなら若いうちがいいよ 警察に通報でお灸据えてやってくれ 家の母は手遅れで財産半分失った 748 名前:名無しさん@HOME[sage] 投稿日:2011/11/28(月) 00 02 40.41 0 741も疲れてるよね。眠いよね。頭回らないよね。 留守電にそんなメッセージなんて普通はただのイタズラ電話としか思わないよね。 明日の朝、消去する時に一応どこからかかったか確認してからどうするか決めたら? 749 名前:741[sage] 投稿日:2011/11/28(月) 00 04 08.19 0 とりあえず今晩は見なかったことにして寝ちゃいます。 アドバイスありがとう。 警察沙汰で万が一義弟が旦那に連絡したら、旦那が安らげないし。 旦那の出張がハードで、慰めがてら子供連れて会いに行った意味がなくなるw 明日の朝以降で考えることにします。 ほんとうにありがとう。 750 名前:名無しさん@HOME[sage] 投稿日:2011/11/28(月) 00 07 27.49 0 まあ正直言って、携帯も知らない仲だったら義兄夫婦は直接関係ない事での「死にます」だろうし そうなると義弟夫婦の間のことだろうから関係ないよね できるだけ巻き込まれないように距離を置いて付き合ったほうがいいよね 751 名前:名無しさん@HOME[sage] 投稿日:2011/11/28(月) 00 22 27.71 O 警察に連絡する時は、心配だから見に行ってみたいな言い方だと取り合ってもらえない時もあるよ。 いままさに死ぬと宣言した緊急性と危険性をアピールして、お断りされそうだったら相手の所属と階級氏名を聞いて 「もしも死んだ場合はあなたに責任の一端があると考え、それなりに対処します」と強気で出るといい。 な死ぬ死ぬ詐欺くらい卑怯な自己主張は無い。 自分の命をかたにして相手に主張を飲ませたり、自分に注目を集めてちやほやさせようって、糞根性曲がりな顕示欲だ。 うちのトメがさんざん死ぬ死ぬをやって、義兄夫婦も私達も心底疲れ果てた こちらに非が無くても年寄り相手だと、周囲の関係無い人達までひどく同情的になるからね。 いま、私と一緒にトメに苦しめられた義兄嫁が、嫌な学習をしちゃって盛んに死ぬ死ぬをやってる。 私達夫婦も義兄もどん底気分を通り越して、いっそ詐欺に失敗してタヒねばいいのにと… 752 名前:名無しさん@HOME[sage] 投稿日:2011/11/28(月) 00 35 08.33 0 翌朝以降で、旦那さんの余裕がありそうな時に、 「留守電に入っていたのを今気づいた!どうしよう」って知らせたらいい 753 名前:名無しさん@HOME[sage] 投稿日:2011/11/28(月) 02 40 55.06 0 義弟何やってんだ Next→49-756
https://w.atwiki.jp/yomedousi/pages/1350.html
スレ49-506 506 名前:名無しさん@HOME[sage] 投稿日:2011/11/19(土) 07 53 08.96 0 私は三兄弟の次男嫁 三男が一番最初に結婚して、次が私達 長男は長らく独身だったんだが、最近遅い春がやってきた 三兄弟の中でも長男が一番出来が良かったというのもあって、親戚連中大喜び! 長男嫁さんは長男より12も下で、おまけに超可愛いし、性格も明るく社交的 たちまち親戚中のアイドルになったんだが、それが面白くない三男嫁が長男嫁さんを一緒に追い出そうと私を誘ってくるのがすごい迷惑wwww さっくり三男を始め親戚中に転送したいんだが…ダメかな? 507 名前:名無しさん@HOME[sage] 投稿日:2011/11/19(土) 07 55 24.93 0 506補足 親戚の集まりの日に 私達で協力して長男嫁さんに恥をかかせてやろうみたいな内容のメールがパラパラ届くんです 508 名前:名無しさん@HOME[sage] 投稿日:2011/11/19(土) 07 59 29.34 P 506 誤爆次男嫁さん乙ですwww にちゃん的には親戚へGO!三男嫁自爆!が面白いけどw 現実的な解決法は夫へ相談がベストだろう。 あまり事を荒立てると返って長男夫婦にも迷惑かけるかもしれないし。 義実家のことは夫に任せるに限る。。 三男嫁には「夫と相談しますね(ミャハッ」と返信しておけばいいよ・ 509 名前:名無しさん@HOME[sage] 投稿日:2011/11/19(土) 09 41 44.74 0 508 誤爆サーセンwww いままでは携帯あまり持ち歩かないから気付かなかったミャハで流してたんだが 夫と相談してみるね☆ この案で行くわ 510 名前:名無しさん@HOME[sage] 投稿日:2011/11/19(土) 10 35 47.40 0 506 トメと義兄と義弟くらいには誤爆しちゃってw Next→49-522
https://w.atwiki.jp/t0944520022/pages/332.html
合計 : - 今日 : - 昨日 : - 只今の時刻 2024年08月30日 (金) 16 57 33 トップページ 地域分類 49 門司駅前〜大里桃山町〜藤松団地〜小倉〜三萩野〜木町〜愛の家車庫 小倉営業所運行 20分間隔 大里桃山地区は比較的新しい地域で、 バス路線延伸と同時に開設した路線です。 49番は元々戸畑発着だったようだが、 同じ門司駅では停留所が違うので注意。
https://w.atwiki.jp/sesimu/pages/1091.html
SPY FICTION Part49 やっぱり顔は撮ってないとねぇ~。 youtube用 上へ ゲーム詳細内容 ゲームタイトル SPY FICTION メーカー ACCESS GAMES 機種 PS2 当時発売日 2003年12月25日 当時定価 7,140円 (税込 ゲームアーカイブ なし 配信日 - 販売価格 - 現在購入可能箇所(2017/6/29時点) 【中古】PS2 SPY FICTION 価格:298円(税込、送料別) (2017/6/29時点) SPY FICTION 【中古】afb 価格:540円(税込、送料別) (2017/6/29時点) マイリスト 一気に動画を見たい人向けですw これで楽に見れると思いますので、お好きな方で閲覧してください。 youtube用 コメント 裏技ややって欲しいこと等ありましたらコメントをお願いいたします。 ゲームごとにコメント分けしていますので、違うゲームの話はご遠慮下さい。 名前 コメント すべてのコメントを見る 上へ
https://w.atwiki.jp/2chsiberiassf/pages/491.html
1944年に開発が始まり、1949年に採用され、1951年に量産が始まったフランス軍制式の半自動小銃。 7.5mm×54というフランス独特の銃弾を使用し、箱型弾倉の装弾数は10発。また、スコープマウントが標準装備されており、フランス軍の制式スコープを装着可能なほか、このマウントにあわせた民生品も多数発売されている。 量産開始時はおろか採用時には既にソ連でAK47が登場しており早くも旧式化していた。しかし信頼性が非常に高く、命中精度も高かったうえにこの種の銃としては短く取り回しが容易だったことから、1979年までフランス軍の主力小銃であり続け、フランスの旧植民地でも広く使われた。 後に銃の短小化と軽量化を行い、スパイク型銃剣用の着剣装置とグレネードランチャー用のフラッシュハイダーを標準装備したMAS-49/56が登場している。
https://w.atwiki.jp/594105s/pages/375.html
このページは105E49 次の問題は105E50 順位 選択肢 得票数 得票率 投票 1 a 101 (86%) 2 d 10 (9%) 3 c 4 (3%) 4 b 2 (2%) 5 e 0 (0%) その他 投票総数 117 次の問題は105E50
https://w.atwiki.jp/xboxcodsearch/pages/101.html
このページは当情報局が主催する第1回 Xbox360版 Call of Duty Black Ops2 HardPoint Tournamentのメインページです。 大会に参加予定の方はこのページをブックマークやお気に入りに登録していただき、各種ページを閲覧可能にしていただきたく思います。 ー気を抜くな、これは戦争だー 第1回 情報局主催 Call of Duty Black Ops2 Hardpoint Tournament 更新情報 7月22日 ページ作成 8月17日 登録締め切りました 8月22日 優勝はFbとなりました。おめでとうございます。 始めに(局長より) ついにやってきたHardpointの大会!!運営長かねてから実施意欲があったものの中々実現が難しかったモードですが、今回は希望が見えてきたため開催決定。運営長一押しのモードで皆さん大いに楽しんでください。あっ、一応アマギフ5000円分用意します。 運営 運営長 ダッシュ 以上 1名 サーチ大会との違い ハードポイントです。 マップは運営側指定 XBOX純正コントローラー以外も使用可能。ただし、連射機能および感度調整機能がついていないゲームパッドに限る。(純正以外のコントローラーでも使っている人が増えてきていため。) VCはゲームチャット以外でも可能。ただしゲーム前ロビーでのやり取りに必要なため、チーム内に最低1人以上はゲームチャット可能な人がいること。 大会概要 タイトル Call of Duty Black Ops2 プラットフォーム XBOX360 開催期間 8月22日 ゲームモード Hardpoint 大会方式 トーナメント戦 必要チーム数 4チーム 定員 8チーム(仮)(16チームへの変更の可能性あり) 試合方式 2マップ先取 関連ページリンク集 大会用ルール(hardpoint) 大会用規定(回線落ち・失格規定)(Hardpoint) 出場登録用ページ 出場登録者一覧 大会チャット(Hardpoint) 大会スケジュール 現在8チームを定員としていますが、様子を見て16チームに増やす可能性があります。 8チームになった場合は1日3試合行います。 8チーム以上になった場合は各日2試合で2日間の実施です。 8月1日 募集開始 8月17日 募集締め切り 8月20日 メンバー追加締め切り 8月22日 大会当日 試合実施日のスケジュール 20 30 大会チャットに集合開始 21 00 点呼開始 21 30 1回戦 1試合目 22 30 1回戦 2試合目 23 30 決勝戦 試合の方式について 2マップを先取したチームの勝利です。 マップは運営側指定です。 1回戦使用マップ RAID STANDOFF SLUMS 決勝戦使用マップ YEMEN RAID STANDOFF 試合の流れについては以下の通り 集合 回線チェック 第1MAP ホスト交代及び回線チェック 第2MAP ホスト交代 第3マップ 攻守選択は特にありません。ホストチームがロビー画面で上のチームとなります。 試合結果の報告について 試合結果の方法については、こちらで作成した大会チャットを利用してください。 大会チャットにおいて、勝利チーム・敗北チームともに報告をお願いいたします。 報告の際は下記の内容を入力をお願いたします。 ・ チーム名及び相手チーム名 ・ マップ取得数 ・ 勝敗 例 試合結果 FUSE - BXIS 2-1でFUSEの勝利 というように投稿をお願いいたします。 試合で使用するルールについて 下記のリンク先に専用ページを作っています 大会用ルール(hardpoint) 使用ボイスチャット ・ 特に制限はありません。ただしゲームロビー内のやりとりにはゲームチャットを使用してください。 ゲーム録画について 試合の際は必ずゲーム録画をオンにしてください。 試合の記録として管理人が内容を確認するのでご協力お願いたします。 試合中のトラブル・マナー・ペナルティなどについて 参加者の方は必ず目を通していただけますようお願いいたします。特にペナルティについては絶対に閲覧してください。 大会に関する注意事項(別ページへのリンク) 賞品について アマゾンギフト券5000円分 動画配信及び観戦について いつも通りCAVETUBEでの配信となります。 試合の観戦は禁止(同じチームでも)・CODキャスト利用可能者は運営および許可を得た配信者のみです。 なお個人での配信については原則禁止です。 どうしてもという方については一度運営にご連絡ください。個々の事案ごとに対応させていただきます。 大会・試合映像の無断配信及び無断アップロードへの対応について こういった事案に関してはトラブルの元となりますので、チーム間でアップロードの許可等を取ったうえで実施してください。 ただし、実際に発生した無断配信・無断アップロードに対しては運営は対処しかねます。[免責事項より] 大会については後日動画を作成するかもしれません。 大会への登録方法について 大会への登録の方法について説明させていただきます。 個人主催であるため多少複雑になっていますがご了承ください。 チーム登録方法 メンバーは最低4名以上とさせていただきます。 なお運営としては5名以上を推奨とさせていただきます。 (過去大会を振り返っても確実に当日人数不足に陥るチームが出ています) 申し込みの際は下記の点を明記の上ご連絡ください。 なお、チーム内で最低1人はVCが可能であることが必須です。(どうしても厳しいという方は管理人にご連絡ください) また代表者の方はしっかりとルールや規定をお読みください。 チーム名 および 読み方 参加メンバー名(ゲーマータグ) 参加メンバーの読み方(放送で読みますので、なるべくタグに則したもの) 代表者(ゲーマータグ) ご要望・メッセージ等 記載例 チーム名 FUSE (フューズ) dashrash(ダッシュ)代表者 mappy 256 (まっぴー) 〃 〃 〃 上記内容を管理者が確認の上、各メンバーのゲーマータグ宛に確認メッセージを送らせていただきます。 ※ゲーマータグを記載する場合は小文字・大文字・空白などに注意してください。メッセージが届かない可能性があります。 なおパソコンの操作ができないような方のために、代理登録も受け付けます。 登録の申し込み先 ① 管理人のXBOXゲーマータグ宛に直接メッセージを送る 管理人のゲーマータグ名は「dashrash」です。ダッシュと呼んでください。 ② 管理人のTwitterアカウント宛にDMを送る 管理人のTwitterアカウントは「dashkun24」です。こちらはダッシュくんと呼んでください。 ③ 下記リンク先の大会登録用ページへの投稿 大会登録用ページ ④ その他皆さんが思いつく運営に伝わる方法 ゲームチャットで口頭での受付や、フレンドを介してのメッセージ送付などです。 自宅への押し掛けや郵送での登録は受け付けません。 なお登録が確定したチームの一覧については随時更新していきます。
https://w.atwiki.jp/mopsprogramming/pages/13.html
Mops概説(Mops Roundup) The Mops Programming Language トップページ この記事は、とても役に立つ事柄を含んでいますが、Ed Williams氏が書かれたもので、もともとはe-zine ATPM -- About This Particular Macintoshに二部構成(Part1 およびPart2)で掲載されたものです(素材は少し変更されています)。この記事は、Mops/PowerMopsの初心者ユーザーまたはこれから利用するかもしれない人に向けて書かれています。 プログラミング言語 Mops はじめに パーソナルコンピューティング経験のなかでも実りが多いのは、役に立つものであれ何であれ、自分のプログラムを書くことです。これは少し危険なことです----常習者、あるいは少なくとも癖になってしまうかもしれないからです。いずれにせよ、少しはMacでのプログラミングに関心があるというのであれば、ぴったりのフリーウェアプログラミングシステムがあります。その名はMops。それは、Macintoshだけのためにデザインされているのです。Mopsシステムは、飽くことを知らない有能なオーストラリア人プログラマであるMike Horeによって、過去15年以上に渡って、暇をみつけては開発され続けてきました。現在配布されているシステムのサイズからいえば、Mopsはまさに最高のMacソフトウェアとしての価値をもつといえるでしょう(7.4MBを$0で割ってみれば判ります----いえいえ、これは実行できません。) Mops, ForthそしてOOP Mopsの非凡さは、デザイン上本質的にMacintosh用プログラミング言語になっているという点にあります。それはAppleScriptが本質的にMacintosh用スクリプト言語であるのに匹敵します。この事実は、それらのどちらにおいても(比較的)容易に利用できるという性質をもたらしています。----もっとも、プログラミングは決して容易なわざではありませんが。そのうえ、Mopsは古いものと新しいものの最良の部分を継ぎ目なく混ぜ合わせているという点でユニークです。その言語は、一般に利用されている最古のプログラミング言語に属するForthに基づいています。MopsはそのForthバックボーンに、非常に堅牢で完全な形のオブジェクト指向プログラミング(OOP)を付け加えました。MopsのOOP実装はOOPシステムが提供すべきものとされるほとんど全ての事柄を含んでいます。多重継承さえ備えているのです。 MopsはMacintosh専用ですから、必要なMacツールボックスおよびシステムサービスを提供するために別段のAPIやフレームワークは必要ありません。ある意味、それらは組込まれています。ですから、どんな種類のMacプログラムも作れますし、(コールバックルーチンなどを含んでいる)シェアードライブラリ(これはシステム拡張を速やかに駆逐しつつあります)も構築することができます。G4 MacintoshモデルのAltiVec実数コプロセッサも、ウィザード水準のベクトル計算プロセッシングのためにサポートされています。(PhotoshopがG4ではなぜこんなに速く走るのか不思議に思ったことはありませんか?) OSXより前のMacのプログラミングサービスをまだあまり御存じない方へ:ツールボックスというのは、OSが提供する途方もなく多くのサービス---- 明らかなものをいくつかあげれば、ウィンドウ、メニュー、ダイアログ ---- への、伝統的なプログラミングインターフェイスを提供するものです。ツールボックスは、数多く定義された"Syscall"の一つによって呼び出され、実行時にはシステムが割り込みをします。最近のOSの幾つかのバージョンでは、CarbonLibというシェアードライブラリが、"カーボン化"されたプログラム---- MacOS9とMacOSXで両立できるようにつくられたもの ---- については、これらの呼び出しの大部分を受け持ち、両プラットフォーム上で、同じ、あるいは類似のサービスを提供することを目指しています。 Forth その歴史 Forthという言語はいくつかの歴史的背景をもっています。Charles H. Mooreは独力でForthを発明したという栄誉が与えられるべき人です。;彼のアイディアが形を取るのは、1950年代のスミソニアン天文研究所でのことです。そこで彼は、その言語がどうあるべきかについて、いくつかの鍵を見つけました。Mooreは1969年までにはForth言語の開発を完成しており、その名前で呼んでいました。初めはIBM 1130ミニコンピュータ用でした。Mooreは、なかでもコンピュータグラフィックスプログラムをForthで書きました。マイクロプロセッサの発明に伴って、Forthは埋込み型コントロールプロセッサでは当たり前になりました。この種のデバイスではコントロールソフトウェアのための領域はごく小さなものです。巨大なプログラミング開発システムなどお話にもなりません。Forthはクロスコンパイリングに役立ち、小さなマシン語プログラムを生産しました。 ANSI Forthスタンダードは存在してはいますが、実際のForthの世界は、おたがいにも、そして標準からも少しずつ異なる、たくさんの変種によって特徴付けられます。ですから、確かにMopsは十分にForthの一員としての地位を確立してはいますが、そのコードのバックボーンは(Forthそのものというよりも)Forth風というのが合理的でしょう。Mopsは実際、特に、Macintoshプログラミングのため、便宜のため、そしてオブジェクト指向オペレーションのために、Forthの規格にはないForth風のwordの定義を数多く追加しています。(Mopsは容易に標準にしたがったANSI Forthコンパイラに変換できます。そして、同じくらい容易に元に戻すことができます。) Mopsは高水準のOOP構成に服する優れたForth風言語ということができます。OOPの上着を着たForthと言うこともできるかも知れません(が、そういうべきではないでしょう)。コードは、他の全てのForthベースの言語と同様、三つの主要な特徴で性格付けられます。:顕在的なスタック、演算子後置(Postfix)記法、そして、言語の拡張性です。 Forthが進化していた時代には、プログラムが利用可能なメモリーは、現在の水準から見れば僅少なものでした。したがって、Forthの記号法の風変わりな性格は、その発明者の恣意や目新しさのために採用されたものではありません。メモリーが安価で豊富となった今となっても、コンパクトなコードが生成されるということは、その実行速度のためには、なお当時に劣らぬ価値があります。 Mops V.4は、Mopsページからダウンロードすることができます。このウェブサイトはたくさんのその他の有用で入門的なアイテムを含んでおり、Forthのドキュメンテーションおよびリソースへのリンクがあります。この中には、この記事の後の方で引用する『Forthの進化(The Evolution of Forth)』も含まれています。 現時点では、PowerMopsのカーボン化されたバージョンV. 5.xが、OSXとの互換性を目指して、利用可能となっています。"古い"標準的なMopsは、Macintosh plusにまで遡る68kプロセッサのためのプログラムを生成します。(‘legacy’コンパイラというべきでしょうか。)より新しいPowerMopsはPowerPCマシンにネイティブにコンパイルし、FATアプリケーション(68kおよびPowerPCマシン両用)もビルドすることができます。 露出スタックと"うしろ向き"記号法 コンパイラの大部分は内部的にスタックオペレーションを広範に利用しますが、効率化のため、Forthではひとつのスタックがいわばオープンにされており、プログラマーがコントロールできるようになっています。これは、データスタック、またはパラメタースタックと呼ばれています。それは、ひとつのForthワードないし手続から、別のそれにデータを渡すために用います。 第二のスタックであるリターンスタックは、大抵は、データではなくて、プログラムのリターンアドレスを含んでいます。しかし、習熟したForthプログラマーなら、それを(一時的にデータを保管するために)利用することも可能です。無限定に"スタック"というときには、いつもデータスタックを意味します。これは、この言語の性質上、プログラマーによって管理される必要があります。(アセンブリ言語のプログラマーも、一般に、これもまた効率化のために、コード内で一つまたはそれより多いスタックを採用します。) Mops --- そしてその他のForthベースの言語でも同様---は、普通の押し下げスタック(push-down stack)を用います。これは後入先出(LIFO)リストともいわれます。Mopsのコーディングスタイルと‘文法’、つまり、正しく言語を拡張する方法は、LIFOリスト操作の表現が適切であるかどうかにかかってきます。 ForthのエキスパートであるElizabeth Ratherは、Association for Computer Machineryに提出された彼女のペーパー「Forthの進化」の中で簡潔に述べています Forthの明示的なスタック使用は、被演算項が演算子に先立つPostfix記法を導く。演算の結果がスタックに残されるため、複数の演算を無理なく連結することができる。そして、一時的データ保管のために変数を定義する必要はほとんど生じない。 (このペーパーは、Ms. Ratherが、常にMooreと"同室にある"か、さもなければ"隣室にある"かのいずれかであった人であるという点で、歴史的に非常に注目すべきものです。彼女自身もこの言語に影響を及ぼしました。)彼女がここで述べているのは、スタックプログラミングはpostfix記法/逆ポーランド記法(RPN)の利用へと、作業への適合性ゆえに自然に繋がるということであり、スタックを利用すれば、変数宣言が必要になる場面は劇的に減少するということだと思います。実際、ヒューレット-パッカードの携帯電算機もRPNを利用してますが、----御想像の通り----スタック指向でもあります。 図1は、一つのスタックの三つの継続する‘ライフ’の段階ないし時点を記述したものです。TOSはスタック最上位(Top Of Stack)を表わしています。 スタック模式図 図1: スタックの三つの段階 次は、全く単純なMopsワードの定義です。これをADDと名付けます。理由は明らかでしょう。: ADD ( n1 n2 -- sum ) + ; ワードAddがすることは、それが呼び出されたときにスタックにおかれているはずの二つの数値を足しあわせることだけです。このワードのスタックコメント(括弧の中)にある記号n1とn2がスタック上に予定される数値を示しています。記号‘sum’は、このワードを呼び出したルーチンに戻ったときには、それはスタックのトップに(この算術計算の性質に従った)結果を残すだろうということを示しています。この定義にある唯一つのコードは、一つの加法演算子ないしプラス記号であることに注意しましょう。 さて、スタックの図に戻りましょう。;一番左の絵は、Addを呼び出す直前のスタックの状態を表わしています。スタックの内容は、入れ子状になった(一部分だけ実行された)いくつかのワードが利用することになっている値と、ツールボックスルーチンによってスタック上に押し込まれた情報といったところです。中間の絵は、ワードAddを呼び出す側によってスタックに押し込まれた二つの整数を表わしています。これらはワードAddの呼出し専用に押し込まれたものです。 右側の絵は演算の結果がトップスタック上におかれることを表わしています。二つのことに注意しましょう。:ひとつには、Mopsの演算子は、その被演算項を一様に消費する、というか使い切ることであり、ふたつめは、スタックの最上位(TOS)のポインタはMopsが自動で面倒を見てくれるということです。(一般に、被演算項がスタック上に残ることは決してありませんが、中間的結果やもっと複雑な処理過程は残ります。) 下は、もう少し面白いMopsのコードサンプルです。 Value TEMP ( at top level ) SUM-OF-SQUARES ( n1 n2 -- n3 ) DUP * - Temp DUP * Temp + ; Value宣言はTempという名前の大域変数を作り出します。‘ ’(コロン)は新たな語を定義するためのForthワードです。コロンからワードの定義が始まり、その後にはその新ワードの名前がきます。この場合には、SUM-OF-SQUARESです。(二乗和演算(sum of squares)とは、二つかそれ以上の個数の数の二乗をつくり、それらを足しあわせるものです。)括弧内に書かれたコメントは、スタック効果コメント、ときには、スタック記録と呼ばれます。スタックコメントはオプションであって、純粋に記録のためのものでしかありませんが、Forthプログラミングでは非常に重要なものとみなされています。コメントを利用すれば、定義されたワードが、実行される際に入力としてスタック上に何を必要とし、出力としてスタック上に何を残すのか、を明確にすることができます。スタックコメントが非常に複雑になることもあり得ますが、そんなときこそ、まさにコメントが最も必要なときと言えるでしょう。 この例でも、このワードが呼ばれる際にスタックの上位に二つの整数があることが必要です。これはn1とn2が表わしています。呼び出し側のワードと呼び出されるワードとの間でこの点に関して齟齬があった場合には、コンピュータ世界は大混乱に陥ります。呼び出されたワードが、それに属していないスタック上のデータを‘喰って’しまったなら、スタックはすぐに辻褄が合わなくなるでしょう。(n2、というより入力パラメターの一番右に書かれた記号はいつもスタックの最上位の値を表わしていますが、このことはこの場合には重要ではありません。)記号n3は、ここで定義されているワードが、終了したときにはスタック上にひとつの値を押し込むだろうということを示しています(性質上、計算された自乗和がそれです)。 スタックコメントは決してデータスタックの地図ではない、ということに注意して下さい。スタック上には、与えられたワードの実行に関連する値より下の方にも、たくさんの値が存在しているかも知れません。下の方のデータアイテムは、それを消費するであろう別のワードに属するものです。 ワードDUPは、スタック操作専用のもので、n2で表わされているトップスタックの値をコピーして、新たなトップスタックセルを作り出します。積演算子‘*’は、トップスタックの値とその直下の値とを掛け算します。その際には、それら二つの値を費消して、積の値が入った新たなトップスタックセルを作り出します。Mops特有の演算子である‘- ’(‘中に入れる(gazinta)’というひらめきに溢れた名前で呼ばれていますが)は、トップスタックの値を、この例のTempのような、ある種の変数に割り付ける格納演算子です。したがって、n2の二乗はスタックから取り除かれ、今度はn1がトップになります。(もちろん、ここでn1,n2といっているのはそれで表わされているデータの値のことです。) コードの2行目は、n1で表わされる値の二乗を前と同じようにして作り出しますが、続いて、単にその名前を書くことを通じてTempの値をスタック上に押し込み、スタックの最上位の値(n2の二乗)とスタックの上から二番目の値(n1の二乗)を足しあわせます。これらの被加算項は、どちらも加法演算によって費消され、その和が、このワードの戻り値としてスタックに押込まれます。(ワードSUM-OF-SQUARESは、いくつかの他の言語では関数と考えるのが適切なものでしょう。)スタックコメントは、文字どおりには普通の意味のプログラムコメントとは別個のものであるとしても、その有用性ははっきりしたものであると思います。 ワード‘;’ (セミコロン)は、ワードの定義を終了させるものです。この短い2行のコードの中で、随分多くのことが起こっていると思いませんか?同じルーチンの、変数の宣言を必要としない、もっと巧妙で本来的なバージョンは、次のようになります。: SUM-OF-SQUARES ( n1 n2 -- n3 ) DUP * SWAP DUP * + ; 非常に便利なワードSWAPは、これも専用のスタック操作子ですが、上ふたつのスタックセルの値を取り替えます。何も費消しません。これだけたくさん説明してきたのですから、残りは研鑽を積まんとする皆さんへの演習として残します。それぞれのワードひとつひとつに集中しましょう。まったく簡単です。 名前付きの入力パラメターや局所変数を用いて、目に見える形でのスタック操作を大部分隠してしまったり、制限したりする方法も、プログラマーにはいくつか利用できます。時として、あまりに複雑な操作が必要になってしまって、それらのような魔法の変数を用いる必要が生じ得ます。(名前付き入力パラメターと局所変数は、Mops特有の言語機能です。) Mopsのスタック指向がもたらす、プログラマにとっての直接の利点は: 速くてコンパクトなコードが生成できる。(Mopsプログラムは、ときとしてアセンブラコードに比肩しうるものとなります。) 大域変数を大きく減らすことができる、というのは、入力・出力パラメターはどちらもスタック上におくことができ、スタックを直前の結果を保存するために利用することができるからです。これは、プログラマーにとっては間違いを起こし易い面倒な作業を省き、プログラムに必要なメモリも減らすことになります。 Mopsの手続は外部変数を使わない限り本来的に自己呼出し可能(Re-entrant)であって、これはコードを単純化するのに決定的に有利です。(再帰性(Re-Entrancy)とは手続が実行中にそれ自身を呼び出しうる能力のことで、非常に便利なものであり、ある種のアプリケーションでは不可欠なものでもあります。)大部分の言語が何らかの再帰性を提供していますが、特別な追加的コンパイラコードを用いて行っています。これに対してMopsの手続は単純かつ生来的に再帰的です。 通常の高水準Mopsワードだけを使ったMopsプログラムは、生来的に(Dijkstra/Parnasの定義の意味で)構造化・モジュール化されています。EXITとEXECUTEを使った場合だけは例外となります(これらはプログラムコントロールを逸らすものです)。プログラミング理論においては、構造化され、かつ/またはモジュール化されたプログラムは信頼性が高いとされています。私の解釈では、これは隠れた‘しくじり(gotchas)’を含みにくいということになります。 ワード、ワード、そしてワード Mopsが持つForth的単純性のもうひとつの側面として、成語規則(どうすればその言語の有効な基礎的要素を形成できるかを教える規則)が非常に単純であることがあります。Forthにおけるシンタックス的要素、ないし識別子とは、空白文字で区切られた文字列である、おしまい。この文字列には空白文字(空白、タブ、改行)を除けば、どんな文字を混ぜてもかまいません。この文字列は、好きなだけ長くても短くてもかまいません。 Mopsの文法は、上で見たような(空白で区切られた と;)新たなワードを定義するための単純な記号と、その他のいくつかの同じように単純な記号とから成っています。もちろん、Mopsにはたくさんの異なる種類のワードがありますが、成語的にはそれらはすべて同じものです。OOP構成にはいくつか追加的な規則が必要になりますが、それらも非常に少なく、かつ単純です。実際、Forthはシンタックスを必要としていないため、それを持たない、という人もいるくらいです。シンタックス上の単純さによって、この言語の三番目の主要な特徴がもたらされます。:利用者による拡張可能性です。 通常の(高水準の)Mopsワードは次の三つのカテゴリーに分類されます。:名前付きデータアイテム、名前付き手続、定義用ワード。定義用ワードにより、利用者は名前付き手続、つまり新たなMopsワードとアクションワードと呼ばれるものを定義できるようになります。実行可能ワード、あるいは‘被定義ワード’は、機能的には他の言語におけるルーチン・サブルーチン・関数に類似し、場合によっては他の言語のコマンドに相当するものもあります。例えば代数がFortranのメタファーないしモデルであるのと同様、Forthのメタファーは自然言語の散文です(‘動詞’が最後にくるドイツ語であるという人もいます。)。非常に多様な範囲に渡る機能的にも様々な要素を、任意の文字列で表わすことができます。予約語は実際上存在しません( と;が数少ない例外に属します)。辞書中のほとんどどんな語でも、その名前を再定義することができます。 Forth言語系でワードという言葉が強調される源泉のひとつは、辞書という機構が用いられいることにもあります。例えば‘+’のようなMopsの既定ワードの全て、そして---ある時点では---利用者のプログラムを包括する全ワードが、辞書内に存在しています。大まかにいえば、まさに辞書こそが、利用者のプログラムそのものなのです。(その辞書の解釈は、小さくて迅速なマシンインストラクションの仕事です。)概念的には、辞書の下に、コンパイラ/インタープリタ プリミティブを含む小さな核が存在しています。 これらの成語的考察全体から導かれるのは、利用者が既存のワードを組合わせて自由に新たなワードを作り出すことができる、完全拡張可能言語です。このことによって、プログラムを容易に整理整頓(factor)することができるようになります--これは非常に重要なプログラミングテクニックです--。 ベテランであるPhillip J. Koopmanは次のように述べています。: Forthプログラムを書くということは、その言語を拡張して、あるアプリケーションの実装に必要な関数の全てを包含するようにする、ということと同値である。したがって、Forthでプログラミングするということは、アプリケーション専用の言語拡張を作り出すことと考えることができる。このパラダイムは、非常に速い編集/コンパイル/テスト周期と相俟って、生産性を著しく増大させるものであるように思われる。各Forthワードが書かれる毎に、それをキーボードからテストして、直ちにプログラマーにフィードバックすることができるのである。 言語の拡張は、プログラムのためにコンパイルされるコードに反映されます。辞書は、はじめにはMops言語の定義しか含んでいませんが、利用者プログラムでの定義を全て含むように、文字通り拡張されます。プログラムがスタンドアローン、つまりダブルクリックで起動可能なプログラムとしてインストールされる前であれ後であれ、そのプログラムの実行とは、結局のところ、辞書を解釈することに帰するのです。 Mopsプログラムの解釈 Mopsプログラムがスタンドアローンで実行されるようにコンパイルされたときでも、プログラムはなおインタープリタモードで実行される、という見方について、補強しておいた方がいいかも知れません。このような実行モードは、しばしば貧弱なパフォーマンスと結びつきますが、Mopsプログラムに関してはそうではありません。 Postfixの解釈可能言語としては、Mopsは、CやJAVAやPascalのような他の今日のポピュラーなプログラミング言語よりも、PostScriptとより多くの共通点を持っています(構造化コードはPascalと共通ですが)。他方、AppleScriptはインタープリタ言語ですが、‘超高速化’よりも使い易さに重点をおいて設計されています。 例えば、上で定義したワードSUM-OF-SQUARESの定義を、何かのプログラムソースに組込む前に、Mopsのデータ入力ウィンドウに入力して呼び出すことによって、インタラクティブ解釈モードでテストすることができます。とても親しみやすいものです。下の図2のように、SUM-OF-SQUARESの定義をMopsのデータ入力(および編集)ウィンドウに入力しました。横線から下の部分です。 定義部分を選択してEnter(リターンでなく)キーを押します。しかしそれをした後も、図のウィンドウの上側部分に見られるように、スタックは空っぽ(empty)なままです。Mops2これは、SUM-OF-SQUARESの定義がコンパイルされてMopsワードとして辞書に移されたからです。(ワードとしての‘コロン’「 」によってMopsはコンパイルモードに入ります。) 図2 ワード定義の入力 図3では、12と24の二つの値が入力され、SUM-OF-SQUARESが単純に名前を書くことによって呼び出されています(キー入力の後Enterキーを押します)。Mopsは、解釈モードでは、数値をスタック上に置き(標準的な動作です)、名前に適合するワードを辞書内に探します--この場合には、そう遠くまで探すまでもありません--。そして、見つかったなら、適合するワードが実行されます。最後には、sum-of-squaresの結果をスタック上に見ることになるのです。 もしもエイリアンのような高速視力を持っていたなら、ワードSUM-OF-SQUARESによって喰われてしまう前の二つの数値がスタック上に見えたことでしょう。もちろん、スタック上の値それ自体をまずenterして、SUM-OF-SQUARESを起動する前に見てみることもできます。Mops上でテストもっと複雑なワード定義を辞書に読み込んだときには、キーボードの前に座って、入力の値の組合わせを様々に変えて、日がな一日テストを続けることもできます。 図3 テストのために値を入力する プログラムの小さな断片部分を他の大部分から独立にテストすることができるということの利点は明瞭でしょう。 Mopsのオブジェクト指向 さて、Mopsのユニークなオブジェクト指向特性に話を遷しましょう。この特徴を備えたフリーウェア言語は、私の知る限りでは、他にはありません。Mopsの唯一人の領主であるMike Horeによれば、オブジェクト指向プログラミング(OOP)は"この言語の本当の力の源泉"であり、付け加えさせてもらえば、それはその主要な"ウリ"です。オブジェクト指向は、完全な形であれ部分的なものであれ、今日ではとてもポピュラーなので、この記事でその利点と美点を売り込む必要はないでしょう。 続く3つの節では、OOPの背景を成す考え方を、いくぶん抽象的に説明しています。OOPの概念をもう良く知っているのなら、"クラス宣言の実例"まで跳んでもかまいません。概念の説明は、Xerox PARCのメンバーでSmalltalkを開発した、Adele Goldbergの見方に従います。彼女は、OOPの発明者と呼ばれるに相応しい人です。ともかく彼女は、確かにかつてPARCスタッフの一員であり、Alan Keyの印象的な言葉によれば、"両手に稲妻をもあやつる"訳者註人でした。 訳者註 訳に自信がありません。原文は"dealt lightning with both hands"です。 目的 OOPの主要な目的は、プログラムの複雑さをより上手く管理することです。OOP実装を行うならば、最初の段階でのプログラムないしシステムの信頼性を向上させるだけではなく、同じくらい重要なことですが、コードの保守管理可能性を拡大させます。 モデル OOPのモデルは、独立した、互いにコミュニケートするオブジェクトというモデルです。このモデルによれば、あるオブジェクトは、もうひとつのオブジェクトにメッセージを送り、それを受け取ったオブジェクトだけが扱い方を知っている、ある操作を要求します。この操作がどのように実行されるかを決めるのはメッセージを受け取ったオブジェクトだけです。したがって、"コンピューティングは、オブジェクトに内在する能力とみなされ、これはいつもメッセージを送ることによって起動される"(A. Goldberg)ことになります。 上に引用された内容からは、Forth、Modula、Algol、およびPascalといった言語が提供するものよりも高い水準のプログラミングパラダイムが導かれます。---これがもっと低水準のパラダイムに無理なく馴染ませられるものであることは、MopsにおいてForthとOOPが継ぎ目なく結合されていることが証拠になります。 基礎的概念 オブジェクト指向アプローチが要求するのは、たった5つの十分に定義された諸概念だけです。:オブジェクト、メッセージ、クラス、メソッド、インスタンスです。 実践上の区別からはじめましょう。:クラスは、ランタイムエンティティーであるオブジェクトを作り出すソースプログラムエンティティーと考えることができます。クラス定義は、オブジェクトのクラスを記述します。ひとつのクラス定義から、ひとつ、ないし複数の同等なオブジェクトを作り出すことができますが、それらオブジェクトのデータの値は、実行時には通常は互いに異なります。辞書内にコンパイルされた静的オブジェクトは固有名を持たなければなりません。個々のオブジェクトは、そのクラスのインスタンスと呼ばれます。 ひとつのオブジェクトは、データのために確保されたある量のメモリーと、ひと組のオペレーションないしメソッドから成ります。データとオペレーションの性質は、そのオブジェクトが表現しているものに依存します。それは、基礎的なデータオブジェクトから、スクリーン上のウィンドウ、ひいては、問題空間におけるあるエンティティーの複雑なモデルに至るまで、広がりうるものです。(例えば、Mopsのデモプログラムは、一群の数学表現を象った、眼を見張るようなパターンを造り出します。)オブジェクトのデータは、論理的にはそのメソッド、つまりそのデータ上に必要なオペレーションを実装するコードとパッケージ化されます。これは、論理的データ-コードカプセル化として知られています。 もうひとつのオブジェクトが、関連するデータを持っているオブジェクトにメッセージを送ることによって、特定のデータを保存、取り出し、加工などすることを求めることができます。この文脈では後者が受け手と呼ばれます。受け手は、そのメソッドセット中に対応物があるメッセージだけを認識します。オブジェクトの肝要な性質は、それ自身のメソッドによってしか、そのメモリーにアクセスすることはできない、ということです。メッセージの肝要な性質は、あるオブジェクトのメソッドを起動する唯一の方法であるということです。 これらの二つの性質の組合わせにより、ひとつのオブジェクトの実装は他のどのオブジェクトの実装のどんな特性にも依存し得ない、ということが保証されます。これは基礎的な利益であるばかりではなく、プログラム開発中、およびとりわけプログラムの保守管理において、実際的な利益にもなります。小さなプログラムを開発していたとしても、あるオブジェクトのクラスの実装を他のものに影響を与えることなく変えてみることができるということはうれしいものです。 Mopsのオブジェクトは一般に、そのデータ構造を構成し暗黙裡にメソッドを補助する、ひとつあるいは多くのもっと下位のレベルのオブジェクトを含んでいるという意味で、合成構造となっていることに注意しましょう。ですから、OOP規則にしたがって、合成されたオブジェクトは、それが含んでいるオブジェクトに‘内部的な’メッセージを送ることができますし、実際に常にそれを行っています。この内部的なメッセージは数多くのレベルで起こり得ます。したがって、ハイレベルのオブジェクトのメソッドは、そのオブジェクト自体ばかりでなく、それ以外の数多くのオブジェクトからも流れ出ている、オペレーションの滝と考えることができます。このことは、インフォーマルな書き方ではありますが、非常に重要なポイントです。 内部的メッセージを送ることは、最終的にはマシンコードに近い原始的なオペレーションで定式化されたメソッドに行き着く連鎖、と考えることができます。内部的メッセージは継承と相俟って非常に高次元の情報隠匿を提供します。プログラマーは、そのプログラムによって起動されるメソッドの大部分について、定義を見ることはありません。;採用しようとするメソッドの名前を知り、理解するだけでいいのです。 最後に、Mopsでは、メッセージは、それ自体はオブジェクトの一部ではないコード、つまり通常のMopsワードから送ることもできます。 クラス宣言の実例 Tic Tac Toeゲーム(三目並べ)を書いていると仮定しましょう。スクリーン上に起こっていることを継起的に記録する、ある種の‘雑用係’オブジェクトが必要であると判断したとしましょう。そのオブジェクトは、プレイフィールドをモデリングするデータレコードを必要とします。各マスに、“誰がそこに打ったか”コード(-1,0,1のどれか)で、印をつけることができなくてはなりません。さらに、そのオブジェクトは、高水準のゲーム遂行ないし決定コードに必要な情報を提供できる必要があります。そのような情報の例としては、‘ボード上のあるパス(行、列、対角線)にまだ誰も打っていないスペースがあるかどうか”や“ボード上のあるパスの数値的状態(-3から3まで)は何か”があります。 下は実際のゲームの実装に使われたクラス定義を略記したものです。(スタック記録の記号‘--’は入力と出力を仕分ける記号です。ですから、スタック記録‘( -- )’は、そのワードが、スタック上にはじめには何の値も期待せず、おわりには何の値も押込まない、というか生産しないということを表わしています。) 三目並べコードサンプル (コードの)2行目が非常に重要です。そこではサイズが9のデータオブジェクトとしてwArrayクラスのデータ構造が宣言されています。このクラスは改めて定義する必要はありません。というのは、この定義は、数多くある他の既定クラスと同様、既に存在しているので、オブジェクトを宣言するだけでいいからです。(後で見るように、そのクラスに特有のメソッドも一緒に‘タダで’付いてきます。)したがって、我々のインスタンス変数、つまりivarは、9-セルのインデクス付きwordアレイです。 最初のメソッドの定義は、‘clearX board_Arr’によってそれ自身を定義しており、これは実際には内部的なデータオブジェクトであるboard_Arrへのメッセージであり、それに対するメソッドclearX は既に定義されています。(‘clearX’の‘X’はTic tac toeのXプレイヤーとは何の関係もありません。;それは作り付けのMopsメソッドの名前の一部でしかありません。) メソッド名はコロン( )で終わらなければならないことに注意して下さい。これは、ほとんど唯一といっていいくらい数少ないMopsの成語規則のひとつです。 次のメソッドFINDZCELL の定義は、‘コード’とboard_Arrへの内部的メッセージとの結合を示しています。そのクラスのオブジェクトは、メソッド‘at ’をどうやって実行するかを知っています。これは、DOループによって提供されたインデックス値を入力としてうけ取ります。 メソッドPUTOMK は、コンピュータが動いたときに利用されますが、スタックから何も受け取らない一方で、O-markコードの値と(大域)セルロケーションであるcelLocをスタック上に押込み、メソッドto と結び付けているという点が、少し面白いでしょう。全てのwArrayクラスオブジェクトが知っているメソッドto には、これら二つの値が必要なのです。;つまり、格納されるべきものとそれが格納される場所です。PUTXMK はプレイヤーがマスをクリックしたときに呼び出されます。(プレイフィールドを受け持つ別のオブジェクトが対応するXおよびOをスクリーン上に書き込みます。) ワード‘;CLASS’は定義を終了させます(‘;’がワード定義を終了させ、‘;m’がメソッド定義を終了させるのと同じです)。したがって、この例の最後の行は、定義の一部では全くなく、BoardRecordという名前のscorekeeperクラスのオブジェクトインスタンスの宣言のサンプルです。そのように、つまり宣言によって生成されたオブジェクトは静的オブジェクトであり、これを含むプログラムのMops辞書の中にコンパイルされます。(Mopsプログラム内のオブジェクトの大部分、しばしばその全てが、静的オブジェクトです。動的オブジェクトは、もう少し手間がかかります。) Mopsの既定クラス Mopsはたくさんの既定クラスを提供しています。これらは、単純なbyte/wordデータオブジェクトからMacintoshウィンドウ、メニューバー、ないしダイアローグに至る範囲のオブジェクトを定義しています。プログラマーとしてはもちろん後半の方の類のオブジェクトに主要な関心があるでしょう。というのは、大部分のプログラムは、ひとつないし複数のウィンドウ、メニュー、ダイアローグを必要とするからです。;そしてそれらを一からプログラムするのは、いわば、‘おぞましい’ことだからです。例えば、直接にMacツールボックスを用いてウィンドウをつくるのは、実際、悩ましい、間違いを犯し易い仕事です。さらに悪いことには、それにはかなりのMac内部に関する知識も必要で、これは、もし避けられるのであれば、大部分の人にはどうでも良いことです。 グラフィカルユーザーインターフェイス(GUI)オブジェクトに関するMopsの既定クラスは、OOPの継承メカニズムを用いて、そこで必要とされる汚らしい低レベルコードを隠しています。例えば、一般に用いられるWINDOW+クラスは、それが必要とする複雑なデータ構造やメソッドの一部の定義を、多くの他のもっと単純なクラスに帰着させているということができます。つまりWINDOW+クラスのインスタンスは、高度に合成的なオブジェクトとなっています。プログラマーはしかし、全く単純なWINDOW+の下位クラス(これはWINDOW+クラスの全てのデータとメソッドを継承します)を書くことで、上位クラスのいくつかの機能を上書きし、あるいは変形することもできます。 しかしながら、例えばWINDOW+クラスに属するオブジェクトを単純に宣言して、例えばそれがツールボックスにおいて‘生きている’ようにするメッセージなど、いくつかのメッセージを送るだけでよいこともしばしばです。既定オブジェクトのためのクラスの定義はソースプログラム中に書き込む必要はありません。というのは、問題の定義は普通はソースプログラムが読み込まれる前に、見えない形で予めロードされているからです。(そのいくつかは辞書のコアグループに属し、いつでもそこに存在しています。)しかし、プログラマーは、自分が用いるオブジェクトに提供されている機能を理解し適正なメッセージを送ることができるためには、そのオブジェクトが該当する既定クラスの定義を熟知していなければなりません。 ドラッグ、拡大、アップデートといった標準的なMacintoshウィンドウの動きは、Mopsのウィンドウクラスが自動的に処理するので、プログラマーは、システムレベルのコードをひっきりなしに書き直すことから解放され、アプリケーションレベルの問題に集中することができます。Mopsのツールボックスクラスの全てについて、ある程度までは同じことがいえます。 MopsはViewオブジェクトもサポートしており、WINDOW+クラスとあわせて広く用いられます。ビューは基本的には、描画を行うことができるウィンドウ内の長方形領域を定義します。ビューは‘子供’ビュー(サブビュー)を持つことができる他、様々な面白い性質を持っています。ビュー構成は、MacApp, TCL, PowerPlantあるいはCocoaといった大部分のMacintosh APIやフレームワークでもサポートされています。 では、一般にオブジェクトはどのようにして生成されるのでしょうか?既に見たように、全てのオブジェクトは、ソースプログラムにおいてクラス定義で定義された、オブジェクトのクラスの1インスタンスです。あるオブジェクトが静的に設置されるのが適当な場合には、上で見た(BOARDRECORD)ような単純なオブジェクト宣言でそれを作り出すことができます。この宣言は、そのクラスのオブジェクトのインスタンス化といわれています。静的オブジェクトの利点は、(動的オブジェクトに比べれば)全てが単純でトラブルが無いことです。また、メッセージ対オブジェクト結合がいつも静的(早期)結合(速い)であることもあげられます。潜在的な欠点は、辞書内にコンパイルされ(‘固着され’)るので、もう邪魔ものになってしまった後でも、プログラム空間を占拠し続けるということです -- これは大きなプログラムでは問題となり得ます --。 その代替物が動的オブジェクトです。これは実行時(runtime)にプログラムのヒープ上に生成されます。その際の構図は少し込み入っています。PowerMopsの最近のバージョン(V.4.x以上)では、動的オブジェクトを生成し管理するための非常に単純なメカニズムである‘Reference’が提供されていて、大部分の交渉を障害なく操作できるようになっています。他方Mops(68k)では、将来のオブジェクトのためにツールボックスからオブジェクトハンドルを得(objHandle宣言)て、オブジェクト生成ステートメント(handleオブジェクトへのnewobj メッセージ)を送らなければなりません。そのようにして生成されたオブジェクトは、そのハンドル名またはインデックスによって参照されます。後者の‘伝統的’方法による場合には、動的オブジェクトに通常割り当てられるヒープのリロケータブルブロック管理に多大な注意を払わなければなりません。 Mops既定クラスの例 下は、基本的なデータクラス定義の例で、クラス名がVarの32ビット整数変数のためのものです。しかし、コードからわかるように、これは、この継承の系譜のなかで最も原始的なものというわけではありません。基本的なデータ定義は皆そうですが、そのメソッドは、通常の高水準のMopsワードで定義されてはおらず、効率化のために低水準のワードで設計されています。この理由は、基本的なデータオブジェクトのためのメソッドは、プログラム内で断トツで頻繁に実行されるメソッドだからです。 class VAR super{ longword } m + inline{ obj +!} ^base +! ;m m - inline{ obj -!} ^base -! ;m ;class このオブジェクトのivarのためのデータオブジェクト宣言が無いことに注意して下さい。これは上位クラスのLongwordが供給してくれるので必要ないのです。メソッド+ と- はそれぞれ増加と減少に当たりますが、これだけでは変数上のオペレーションとしては不十分なように思われます。ここでもまた、上位クラスであるLongwordがローンレンジャーのごとく救助に現れます。Longwordは、とりわけGet , Put ,およびClear のメソッドを既に持っているのです。したがって、VARは暗黙の裡にこれらのメソッドを持っているのです(継承)。Longwordは他にも多くの基本的データクラスにとってジェネリックな上位クラスとなっていて、それらの下位クラスに共通のメソッドの全てを定義しています。VARのクラス定義は、ジェネリックな上位クラスからの継承に依存しているという点で、多くのMopsの基礎的クラスにみられる特徴をみせています。 このほとんど対極にあるのがMenuクラスの定義です。25個くらいあるうちの適当ないくつかを、下に挙げておきましょう。これには普遍的に用いられるワードも含まれています。(この例はPowerMops V.4.xから引かれたものです。もっと後のバージョンのPowerMopsではコードは変わっているかも知れませんが、実例による理解という目的のためには適当な例といえるでしょう。) メニュークラス定義コード 上位クラスx-Array(execution tokenのアレイ)は、このクラス定義がそのデータ構造に関してx-Arrayを継承していることを示していますが、クラス定義においてはこのアレイのサイズを固定する必要はありません。サイズの特定は、このメニュークラスのオブジェクトのインスタンス化のためにオブジェクト宣言をするまで延期することができますし、普通はそうします。(これは直観的にはアレイ型クラスの特徴ではありません。)サイズの特定によって与えられたメニューオブジェクトのアイテムの数が決まるのですから、プログラムがこの値を自分できめる必要があることは明らかです。 普通は、どんなプログラムもInit メソッドにあたるメッセージを送るでしょう。これは、メニューオブジェクトの全アイテムに動作を割り当てます。--- 例えば、ファイルメニューの新規アイテムをユーザーが選択した場合のプログラムの反応などです。また、プログラムは大抵、非-リソース-ベースのメニューのためのNew か、リソース-ベースのメニューのためのGetnew のどちらかを呼ぶでしょう。どちらのメソッドもメニューレコードをツールボックスに渡します。どちらのメソッドも完全にサポートされています。 リソースベースのメニューについては、プログラマーは、アップルのフリーウェアであるResEditのようなリソースエディタを用いて、‘menu’リソースとして、文字通り各メニューの絵を描きます。これは全く易しく、私には他の方法は考えられません。リソースベースのアプローチは、プログラムがずっと単純になり、全く一般的に用いられています。平均的なMopsプログラムには、ともかく他にもいくつかリソースが必要となるでしょうから、メニューリソースをそれに追加するのもそれほど大変ではありません。 GetItem とPutItem メソッドによって、いわば実行時にメニューアイテム名をいじりまわすことができます(これはユーザーを全く混乱させてしまうかも知れませんが)。 プログラムの多くはCheck およびUncheck メソッドを用いるでしょう。;前者はクリックされたアイテムの名前の脇にちいさなチェックマークを付け、後者はそれを消します。ワード‘1+’はトップスタック上にある数値に1を加えるための簡便法です。 大文字と小文字で書かれた分かりやすい名前、たとえばGetMenu, InsertMenu, SetMenuItemText, CheckItemなどは全てシステムコール、ないしSyscallです。これらはMacツールボックスサービスを起動します。知っておくべき重要な点は、Mops自体に属する名前と違って、Syscall名は大文字/小文字を識別する(case sensitive)ということです。(徹底してそうです。ツールボックスはMopsでは極めて特異な存在です。) 下位クラスと上位クラス 全てのクラス定義はオブジェクトのひとつのクラスを定義しますが、そのような定義はみな、同時に別のクラス定義の下位クラスでもあります。上位クラスもまたプロト・クラスオブジェクトでない限り、それ自体ひとつの下位クラスです。つまり、全てのユーザー定義クラスと既定クラスは、Objectクラスを除けば、直近の上位クラスを持っているということです。(ひとまずは、多重継承の可能性は措いておきましょう。これをすれば、クラスは複数の直近上位クラスを持つことができます。) したがって、ユーザー定義クラスは、その上位クラスの連鎖からivarとメソッドをともに継承します(継承とオーバーライド(上書き)については後述)。このことは、(ツールボックス等を通じて)オペレーティングシステムと交渉し、典型的には系譜中にMopsの既定ツールボックスクラスを含んでいるようなユーザー定義クラスには、とくにあてはまります。そのようなクラスは普通は下位クラスと呼ばれたりしますが、これは厳密には観点の問題です。 継承とオーバーライディング クラス定義はその上位クラス(とその上位クラスとその…上限まで続く)のインスタンス変数とメソッドの両方を継承します。クラス定義は、その上位クラスの名前をオーバーライドしなければなりません。クラス定義はその上位クラスのインスタンス変数をオーバーライドすることはできません。;それは無条件に継承されます。クラス定義は、その上位クラスのメソッドに加えて新しいメソッドを付け足したり、上位クラスのメソッドと同じ名前のメソッドを定義することによって、上位クラスのメソッドのいくつかをオーバーライドすることができます。(Objectクラスだけはひとつもivarを持たないので、そこからは何のivarも継承されないということに注意しましょう)。 実践的留意点としては、下位クラスで定義されることなく継承されるメソッドの数が増えればそれだけ、結果としてできるプログラムは(他が皆同じとすれば)小さくなります。 多重継承 他のオブジェクト指向言語のいくつかとも共通ですが、Mopsは多重継承を提供しています。これによれば、クラスは複数の直近上位クラスを持つことができ、その結果、人が父と母を持ち、その両方から性格を受け継ぐのと同じように、二つあるいはそれ以上の異なる系譜線をもつことができます。多重継承が可能であることによって、二つかそれ以上の既存のクラスに由来する諸機能を新しいクラスにおいて混ぜ合わせることができるようになります。(初めは単一継承クラスで経験を積みましょう。)これは必要な場面では非常に強力な機能で、しばしば、完全なオブジェクト指向実装の試金石とみなされています。Mopsの既定クラスのいくつかは、主としてハイブリッドなデータ構造を得るために、多重継承を採用しています。 メッセージ束縛 Mopsは、早期ないし晩期のメッセージ対オブジェクト結合を達成するための、様々な方法を提供しています。静的(早期)結合(early bind)v.s.動的(晩期)束縛(late bind)は、本質的には実行スピードとプログラミング上の柔軟性とのトレードオフです。晩期結合では、メッセージの受け手は実行時までわかりません(というか、実行時に決まります)。これは、複雑でいくぶんか秘教めいた主題ですから、Mopsは可能な結合モードを広範にサポートしている、といっておけば十分でしょう。有名なSmalltalkシステムは、全ての場合について晩期結合しか提供していません。 結論 一人の人間の努力によるものであるため、Mopsは、最も安定したプログラミングシステム、というわけにはいきません。;他方で、Mopsの"技術サポートスタッフ"は、実際、非常に聡明です。開発者であるMike Horeは、実際の問題のレーポートを快く受け入れることで知られ、通常は、非常に迅速に修正か回避方法を返答してくれます。更に加えて、数多くの経験豊かなMopsユーザーが、システムのあれこれの分かりにくい点について、よろこんで説明ないし助言してくれます。大部のMopsマニュアルは編成替えの余地はあるものの、注意深く読めば十分な情報が含まれており、また大部分が明瞭に記述されています。 私が最初にMopsに出会った頃には、Forthから受け継がれたものである‘逆向き’記法は、控えめにいっても苛つかせるものでしたが、そんなことも全くすぐに克服されてしまいました。スタックプログラミングの側面には、それに十分に習熟してしまった後では、そのあまりの経済性、効率性等々にショックを受けました。しかし、私はなおもオブジェクト指向プログラミングのファンであり、これが、Mopsが私を惹き付ける理由となっています。私は、MopsのクリーンなOOP実装方法が気に入りました。その多くが直観的なのです。 Mopsシステムは四つの部に分かれた370ページを超えるマニュアルを含んでいます。第一部のチュートリアルを除けば、MopsのForth言語的側面を完全にカバーすることは意図されていません。私は、このギャップを埋めるための、よいForthレファレンスが必要であることに気付きました。これについては、FORTH inc.から出ている Forth Programmer's Handbook が、優れた価値のあるものとして推薦できると思います。ともあれ、OOP(あるいはそれを用いるForth)が好きか、あるいは、できれば試してみたいという人には、Mopsは良い‘買い物’であると、私は思います。 著作 © 2002 Edward Williams 邦訳 Nao Sacrada トップページ